package pe.com.pgn.consolidadorventas.servidorcentral.util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipInputStream;

import org.apache.log4j.Logger;

public class ArchivosUtil {

	static Logger logger = Logger.getLogger(ArchivosUtil.class);
    
	public static boolean verificarExistenciaArchivo(String ruta){
		File fichero = new File(ruta);
		boolean sw = false;
		if(fichero.exists()){
			sw = true;
		}
		return sw;
	}
	
	public static boolean borrarArchivo(String ruta){
		File fichero = new File(ruta);
		boolean sw = fichero.delete();
		return sw;
	}
	
	public static List<String> cargarArchivo(String ruta,String codificacion) {
		
		File archivo = null;
		InputStreamReader isr = null;
		FileInputStream fs = null;
		BufferedReader br = null;
		String linea = "";
		List<String> lineas = null;

		try {
			
		   archivo = new File(ruta);
		   fs = new FileInputStream(archivo);
		   
		   //isr = new InputStreamReader(fs,"Unicode");
		   isr = new InputStreamReader(fs,codificacion);
		   br = new BufferedReader(isr);
		   lineas = new ArrayList<String>();
		   while((linea=br.readLine())!=null){
	          lineas.add(linea);
	       }
		   
		}catch(FileNotFoundException f){ 
		   lineas = null;
		   logger.error("No existe el archivo :"+ruta);		   
		}catch(UnsupportedEncodingException ue){
		   lineas = null;
		   logger.error("El archivo "+ruta+" no es unicode");
		}catch(IOException e){
			lineas = null;
			logger.error(e.getMessage());
		}finally{	   
		   try{                    
		      if( br != null ){ br.close(); }	      
		      if( fs != null ){ fs.close(); } 
		   }catch (IOException ioe){ 
			  //Exception de entrada salida al cerrar o abrir archivo
			  logger.error(ioe.getMessage());
		   }
		}
		return lineas;
	}
	
	public static boolean guardarArchivo(String rutaGuardar,List<String> lineas){
		FileWriter fichero = null;
	    PrintWriter pw = null;
		boolean sw = false;
		try {
			fichero = new FileWriter(rutaGuardar);
	        pw = new PrintWriter(fichero);

	        int dim = lineas.size();
			for (int i = 0; i < dim ; i++)
                pw.println(lineas.get(i));
		} catch (IOException e) {
			LoggerUtil.error(logger, e.getMessage());
		} finally{
			try {
		        // Nuevamente aprovechamos el finally para 
		        // asegurarnos que se cierra el fichero.
		        if (null != fichero){
		            fichero.close();
		            sw = true;
		        }
		    } catch (Exception ex) {
		    	LoggerUtil.error(logger,ex.getMessage());
		    }
		}
		
		return sw;
	}
	
	public static void crearArchivoBinario(String rutaFichero,byte[] buffer){
		//http://enjava.blogspot.com/2007/06/convertir-byte-archivo.html
		try{
			File file = new File(rutaFichero);
			file.createNewFile();
			FileInputStream fileInputStream = new FileInputStream(rutaFichero);
			ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(buffer);
			OutputStream outputStream = new FileOutputStream(rutaFichero);
			int data;
			while ((data = byteArrayInputStream.read()) != -1) {
				outputStream.write(data);
			}

			fileInputStream.close();
			outputStream.close();
		}catch(Exception e){
			logger.error(e.getMessage());
		}
		
	}
	
	public static void descomprimirArchivo(String archivoZip,String rutaSalida){
			//http://www.devtroce.com/2010/06/25/comprimir-y-descomprir-archivos-zip-con-java/
			BufferedOutputStream bos = null;
			FileInputStream fis = null;
			ZipInputStream zipis = null;
			FileOutputStream fos = null;
	 
			try {
				fis = new FileInputStream(archivoZip);
				zipis = new ZipInputStream(new BufferedInputStream(fis));
				if (zipis.getNextEntry() != null) {
					int len = 0;
					byte[] buffer = new byte[1024];
					fos = new FileOutputStream(rutaSalida);
					bos = new BufferedOutputStream(fos);

					while  ((len = zipis.read(buffer)) != -1)
						bos.write(buffer, 0, len);
					bos.flush();
				} else {
					LoggerUtil.info(logger,"El zip no contenia fichero alguno");
				} // end if
			} catch (Exception e) {
				LoggerUtil.error(logger, e.getMessage());
			} finally {
				try{
					bos.close();
					zipis.close();
					fos.close();
					fis.close();
				}catch(IOException ex){
					LoggerUtil.error(logger, ex.getMessage());
				}	
			} // end try
	}
}
